package com.powernode.ssm.springAnalysis.a12.def_JDK.d3;

import java.lang.reflect.Method;

/**
 * 手写JDK实现动态代理三版：
 * 增加方法对象作为参数传入代理类，区分是哪个目标方法
 * 然后利用反射来调用目标方法，最后达到独立增强每个目标方法的效果
 * 调用流程：见注释数字
 */
public class D3 {

    interface Foo3 {
        void foo() throws Throwable;
        void bar() throws Throwable;
    }

    static class Target implements Foo3 {
        public void foo() {
            System.out.println("target foo");
        }

        @Override
        public void bar() {
            //5
            System.out.println("target bar");
        }
    }

    @FunctionalInterface
    interface InvocationHandler {
        void invoke(Method foo, Object[] objects) throws Throwable;
    }

    public static void main(String[] param) throws Throwable {
        //把增强逻辑作为参数传入，通过函数式接口InvocationHandler接收
        $Proxy3 $Proxy3 = new $Proxy3((Method method, Object[] objects)->{
            //4
            System.out.println("before");
            //反射调用目标方法
            method.invoke(new Target(),objects);
        });
        //2
//        $Proxy3.foo();
        $Proxy3.bar();

    }
}